Ollama 可以在本机运行大语言模型,并提供 HTTP API。借助 JavaScript 客户端,Node.js 应用可以向本地模型发送对话请求。本文将介绍环境准备、模型下载、JavaScript 调用,以及如何通过微调训练自己的模型。

先说清楚一件事:npm install ollama 只安装 JavaScript 客户端,不会安装 Ollama 服务或模型。使用前还需要安装 Ollama,并下载要运行的模型。


一、准备运行环境

1. 安装 Ollama

从 Ollama 官网下载安装对应操作系统的版本:

https://ollama.com/download

安装完成后,在终端检查是否安装成功:

        
ollama --version
        
      

Ollama 通常会在本机启动服务,并通过以下地址提供 API:

        
http://localhost:11434
        
      

如果请求连接失败,请先确认 Ollama 应用或服务已经启动。

2. 下载模型

使用 ollama pull 下载模型:

        
ollama pull gemma4
        
      

模型名称和标签需要与 Ollama 模型库中实际可用的名称一致。如果这个名称不可用,请先到模型库查询正确名称和标签:

https://ollama.com/library

例如,下载其他模型时,命令形式通常如下:

        
ollama pull <模型名称>
        
      

下载后,可以用下面的命令在终端测试模型:

        
ollama run gemma4
        
      

模型下载后会保存在本机,不需要每次运行程序时重新下载。


二、创建 JavaScript 项目

创建一个 Node.js 项目并安装 Ollama 客户端:

        
mkdir ollama-js-demo
cd ollama-js-demo
npm init -y
npm install ollama
        
      

如果要在 Node.js 中使用 import 语法,可以在 package.json 中添加:

        
{
  "type": "module"
}
        
      

也可以将 JavaScript 文件保存为 .mjs 后缀。


三、发送一条对话请求

新建 index.js:

        
import ollama from "ollama";

const response = await ollama.chat({
  model: "gemma4",
  messages: [
    {
      role: "user",
      content: "Why is the sky blue?",
    },
  ],
});

console.log(response.message.content);
        
      

运行程序:

        
node index.js
        
      

这里的 model 必须对应本机已经下载的模型名称。若运行时报模型不存在,请先执行:

        
ollama pull gemma4
        
      

对话消息格式

messages 是一个消息数组,常见角色包括:

  • system:设置助手的行为或回答规则。

  • user:用户输入。

  • assistant:模型的回答,常用于传入已有对话历史。

例如:

        
const response = await ollama.chat({
  model: "gemma4",
  messages: [
    {
      role: "system",
      content: "你是一名严谨的中文技术助手,请用简洁的中文回答。",
    },
    {
      role: "user",
      content: "什么是 JavaScript 的 Promise?",
    },
  ],
});

console.log(response.message.content);
        
      

四、实现多轮对话

模型不会自动记住上一次请求的内容。多轮聊天时,需要在请求中继续传入之前的消息:

        
import ollama from "ollama";

const messages = [
  {
    role: "system",
    content: "你是一名耐心的 JavaScript 助教。",
  },
  {
    role: "user",
    content: "什么是闭包?",
  },
];

const firstResponse = await ollama.chat({
  model: "gemma4",
  messages,
});

messages.push(firstResponse.message);

messages.push({
  role: "user",
  content: "能给我一个简单的代码示例吗?",
});

const secondResponse = await ollama.chat({
  model: "gemma4",
  messages,
});

console.log(secondResponse.message.content);
        
      

实际项目中,应根据上下文长度限制控制历史消息数量。对话越长,通常占用的内存和计算资源也越多。


五、流式输出

默认情况下,程序会等待模型生成完毕后再拿到完整回答。流式输出可以让回答逐步显示:

        
import ollama from "ollama";

const stream = await ollama.chat({
  model: "gemma4",
  messages: [
    {
      role: "user",
      content: "写一段介绍 Ollama 的短文。",
    },
  ],
  stream: true,
});

for await (const part of stream) {
  process.stdout.write(part.message.content);
}
        
      

流式输出适合命令行工具和聊天界面,可以减少用户等待完整回答的感受。


六、错误处理

实际应用中,建议对模型未安装、服务未启动等情况进行错误处理:

        
import ollama from "ollama";

try {
  const response = await ollama.chat({
    model: "gemma4",
    messages: [
      {
        role: "user",
        content: "你好,请用一句话介绍自己。",
      },
    ],
  });

  console.log(response.message.content);
} catch (error) {
  console.error("调用 Ollama 失败:", error.message);
  console.error("请确认 Ollama 服务已启动,且模型已下载。");
}
        
      

常见问题:

问题

检查方向

无法连接服务

检查 Ollama 是否已安装并启动

模型不存在

检查模型名称,并运行 ollama pull <模型名称>

响应较慢

检查硬件资源、模型大小和上下文长度

内存不足

尝试使用更小的模型,或关闭其他占用资源的程序


七、重要安全提示

Ollama 的本地 API 适合在本机或受控服务环境中使用。若要将其用于 Web 应用,建议由自己的后端服务器调用 Ollama,再由前端请求后端。

不要在公开网页中直接暴露服务地址,也不要把密钥、个人隐私或敏感业务数据随意发送给模型。部署到服务器时,应额外配置访问控制、网络隔离和请求限流。


八、如何微调模型

1. Ollama 本身不是训练工具

Ollama 的主要用途是运行模型和提供推理接口,不是直接训练或微调模型。

常见的微调流程是:

  1. 准备训练数据。

  2. 使用训练工具对基础模型进行微调,常见方法包括 LoRA 或 QLoRA。

  3. 将训练结果导出为 Ollama 可用的模型格式,常见做法是转换为 GGUF。

  4. 编写 Modelfile,通过 ollama create 创建本地模型。

  5. 像调用普通 Ollama 模型一样使用它。

常用训练工具包括 Transformers、PEFT、TRL、Unsloth 和 Axolotl。选择工具时,需要确认它支持目标模型架构,并检查模型许可证及硬件要求。

微调不是简单地让模型“记住几条文本”。它通常需要合适的 GPU、训练数据和训练流程。设备资源有限时,可以先从小模型和 LoRA 开始。

2. 准备训练数据

训练数据应尽量准确、清晰,并符合预期任务。常见的对话数据可以使用 JSONL 格式,即每行一个 JSON 对象,例如:

        
{"messages":[{"role":"user","content":"如何重置密码?"},{"role":"assistant","content":"请在登录页面点击“忘记密码”,并按提示完成验证。"}]}
{"messages":[{"role":"user","content":"如何联系技术支持?"},{"role":"assistant","content":"请通过产品内的帮助中心提交工单,并附上问题描述。"}]}
        
      

数据准备建议:

  • 覆盖模型实际要处理的任务类型。

  • 清理错误答案、重复内容和无关信息。

  • 不要在训练数据中包含未经授权的个人信息或机密内容。

  • 训练集和验证集应分开,用验证集检查模型是否过拟合。

  • 确认训练数据、基础模型和最终模型的许可证允许你的使用方式。

训练数据的格式需要与所选训练框架兼容。上面的格式是示例,具体字段可能需要按框架要求转换。

3. 使用 LoRA 或 QLoRA 微调

LoRA 会训练一组较小的适配器参数,而不是重新训练整个模型。QLoRA 则通常通过量化基础模型来减少显存占用。

一个典型工作流如下:

  1. 选择基础模型,并确认训练框架支持该模型架构。

  2. 准备并检查训练数据。

  3. 在训练框架中指定基础模型、数据集、训练轮数、学习率和 LoRA 参数。

  4. 启动训练,并通过验证集检查结果。

  5. 保存 LoRA 适配器,或将适配器与基础模型合并。

  6. 按 Ollama 支持的格式转换或导出模型。

训练配置因模型、框架和硬件而异,因此没有适用于所有模型的一条通用训练命令。正式训练前,建议先用少量数据跑通完整流程,并记录基础模型的精确名称、版本和来源。

4. 转换模型并导入 Ollama

Ollama 可以通过 Modelfile 创建本地模型。常见方案是准备 GGUF 格式的基础模型,必要时再准备兼容的 LoRA 适配器。

新建一个 Modelfile:

        
FROM ./model.gguf

PARAMETER temperature 0.7
SYSTEM 你是一名严谨的中文技术助手,请清晰、准确地回答问题。
        
      

其中 ./model.gguf 应替换成实际模型文件路径。然后创建本地模型:

        
ollama create my-assistant -f Modelfile
        
      

运行新模型:

        
ollama run my-assistant
        
      

如果使用 LoRA 适配器,只有在适配器与基础模型及其版本兼容时才能正确加载。不同模型架构和训练工具的导出格式可能不同;请按照 Ollama 当前支持的导入格式准备文件,并在 Modelfile 中配置相应的基础模型和适配器路径。若需要合并适配器或转换 GGUF,通常要使用对应训练框架或模型转换工具完成,而不是由 ollama create 自动训练。

5. 在 JavaScript 中调用微调后的模型

创建成功后,调用方式与普通模型一致,只需将 model 换成新模型名称:

        
import ollama from "ollama";

const response = await ollama.chat({
  model: "my-assistant",
  messages: [
    {
      role: "user",
      content: "请介绍一下你的用途。",
    },
  ],
});

console.log(response.message.content);
        
      

九、总结

使用 JavaScript 调用 Ollama,通常需要完成以下步骤:

  1. 安装 Ollama。

  2. 下载所需模型。

  3. 安装 npm 客户端。

  4. 在 Node.js 中调用 ollama.chat()。

如果要微调模型,则需要额外使用训练框架准备数据并完成训练,再将结果导出为 Ollama 可用的格式。Ollama 负责模型运行与调用,微调训练通常由其他机器学习工具完成。